package com.masu.knows.portal.security;

import com.masu.knows.portal.service.impl.UserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import javax.annotation.Resource;

/**
 * @author 沈传尚
 * @date 2021/12/8
 */
@Configuration
//启动springSecurity的权限管理功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter{
   @Autowired
   private UserDetailsServiceImpl userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 在用户点击登录时 会触发这个方法 这个方法会调用"loadUserByUsername"方法 根据用户输入的用户名查询用户详情
        // 至于登录是否成功 以及验证码登录过程 都在框架中封装了 我们只能在页面看到结果.
        auth.userDetailsService(userDetailsService);
    }

    // 设置可访问内容
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 对请求进行授权设置
        http.authorizeRequests()
                // 设置匹配路径
                .antMatchers(
//                        "/index_student.html",
                        "/js/*",
                        "/css/*",
                        "/img/**",   //   '/*'是拦截所有的文件夹,不包含子文件夹;   '/**'是拦截所有的文件夹及里面的子文件夹
                        "/bower_components/**",
                        "/login.html",
                        "/register.html",
                        "/register/student",
                        "/index_student.html"
                ).permitAll()     //  上述路径全部允许访问
                .anyRequest().authenticated()  //其他请求需要登录登录之后才能访问
                .and().formLogin()    // 登录使用表单认证
                .loginPage("/login.html")   // 设置自定义登录页面
                .loginProcessingUrl("/login") // 设置处理登录的路径
                .failureUrl("/login.html?error")  // 设置登录失败的路径
                .defaultSuccessUrl("/index.html")  //设置登录成功的页面
                .and().logout()  // 设置登出
                .logoutUrl("/logout")  //设置登出路径
                .logoutSuccessUrl("/login.html?logout")  // 设置登出后显示登录页面
                .and().csrf().disable();   //
    }

}
